home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / music / 55 / applic / enhance.c < prev    next >
C/C++ Source or Header  |  1986-09-18  |  17KB  |  785 lines

  1. #include <osbind.h>
  2. #include <stdio.h>
  3. #include <butmac.h>
  4. WORD handle,work_in[12],mouse;
  5.  
  6. /* handle - GEM AES graphics handle
  7.    work_in - GEM VDI input array
  8.    mouse -  flag indicates graphic cursor state (ON or OFF) */
  9.  
  10. WORD work_out[57],c_ht,c_wd,rcv_flag;
  11.  
  12. /* work_out - GEM VDI output array
  13.    c_ht - character height in pixels
  14.    c_wd - character width  "    "
  15.    rcv_flag - indicates ASCII recording ON or OFF */
  16.  
  17. WORD palette[16],rgb_in[3],xr,yr,xc,yc,margin,res,inv_video;
  18.  
  19. BYTE *gbuf, *scrn;
  20.  
  21. FILE *s_chan;
  22.  
  23. /*  gbuf -  graphics buffer pointer
  24.     scrn -  screen buffer array */
  25.  
  26. WORD pxy[8];
  27.  
  28. struct mfdb{
  29.     LONG address;
  30.     WORD width, height, raster, form, planes, dummy1, dummy2, dummy3;
  31.     }sMFDB,dMFDB;
  32.  
  33. WORD intin[128], intout[128], ptsin[128], ptsout[128], contrl[12];
  34.  
  35. main()
  36. {
  37. int iii;
  38. iii = 0;
  39. init();
  40. while(iii != -1){
  41.     control();
  42.     }
  43. }
  44.  
  45. /* ----------------- program termination ------------------- */
  46.  
  47. end_prg()
  48. {
  49. Mfree(scrn);                /* return array space             */
  50. Cconout(ESC);                /*  cursor off                  */
  51. Cconout('f');
  52. v_clrwk(handle);            /*  clear screen                */
  53. v_clsvwk(handle);           /*  tell AES we're quitting     */
  54. appl_exit();                /*  and terminate               */
  55. Pterm0();
  56. }
  57.  
  58.  
  59.  
  60.  
  61. init()
  62. {
  63.  
  64. /*  usual GEM VDI & AES initializers  */
  65.  
  66. WORD i,j,x,h,p;                     /* local variables */
  67.  
  68. LONG crud;
  69.  
  70. appl_init();                        /* initialize application  */
  71. handle = graf_handle(&x,&x,&x,&x);  /* get VDI graphics handle */
  72. for(i=0;i<10;i++)work_in[i]=1;      /* set up workstation      */
  73. work_in[10]=2;                      /*  "   "     "        */
  74. v_opnvwk(work_in,&handle,work_out); /*  "   "     "        */
  75. graf_mouse(256,0);                  /* mouse off           */
  76. v_clrwk(handle);                    /* clear screen        */
  77. xr = work_out[0];
  78. yr = work_out[1];
  79. vq_extnd(handle,1,work_out);
  80.  
  81. crud = Malloc(32000L);                /* space for screen */
  82. if(crud <= 0L){
  83.     printf("ERROR - insuficient memory!");Cconin();
  84.     Pterm0();
  85.     }
  86.  
  87. dMFDB.address = crud;
  88. sMFDB.address = Physbase();
  89.  
  90. sMFDB.height =  399;             /* yr; */
  91. sMFDB.width = 639;               /* xr; */
  92. sMFDB.raster = 40;               /* xr / 16; */
  93. sMFDB.form = 1;
  94. sMFDB.planes = 1;                /* work_out[4]; */
  95. sMFDB.dummy1 = 0;
  96. sMFDB.dummy2 = 0;
  97. sMFDB.dummy3 = 0;
  98.  
  99. dMFDB.height =  399;             /*  yr;   */
  100. dMFDB.width = 639;               /*  xr;   */
  101. dMFDB.raster = 40;               /*  xr / 16;  */
  102. dMFDB.form = 1;
  103. dMFDB.planes = 1;                /* work_out[4]; */
  104. dMFDB.dummy1 = 0;
  105. dMFDB.dummy2 = 0;
  106. dMFDB.dummy3 = 0;
  107.  
  108.  
  109. pxy[0] = 0;
  110. pxy[1] = 0;
  111. pxy[2] = 639;
  112. pxy[3] = 399;
  113. pxy[4] = 0;
  114. pxy[5] = 0;
  115. pxy[6] = 639;
  116. pxy[7] = 399;
  117. graf_mouse(0,0L);
  118. graf_mouse(257,0L);
  119. i = form_alert(1,"[0][Welcome to ENHANCE|<HELP> gives a function menu][Okay]");
  120. graf_mouse(256,0L);
  121. Cconout(BELL);
  122. v_clrwk(handle);
  123. }
  124.  
  125. /* -------------- DEGAS screen load (needs work) -------------- */
  126.  
  127. load_pic()                       /* starts like send_file() */
  128. {
  129. BYTE d_path[256],f_spec[256],f_name[40];
  130. WORD j, r, ret, button, p_chan;
  131. BYTE c,*pbuf;
  132. unsigned WORD i,n;
  133.  
  134. strcpy(d_path,"\\*.*");
  135. strcpy(f_spec,"________.___");
  136. sav_scrn();
  137. graf_mouse(0,0L);
  138. graf_mouse(257,0L);
  139. ret = fsel_input(d_path,f_spec,&button);
  140. graf_mouse(256,0L);
  141. rst_scrn();
  142. if(button == 1){
  143.     r = Getrez();
  144.     combine(d_path,f_spec,f_name);
  145.     for(i=0;i<40;i++){
  146.         if((f_name[i] == '.')||(f_name[i] == 0))break;
  147.         }
  148.     f_name[i++] = '.';
  149.     f_name[i++] = 'p';          /* here the file .ext is forced */
  150.     f_name[i++] = 'i';
  151.     c =  r + 49;
  152.     f_name[i++] = c;
  153.     f_name[i] = 0;
  154.     p_chan = Fopen(f_name,1);
  155.     if(p_chan > 0){
  156.         pbuf = (BYTE *)&r;
  157.         n = Fread(p_chan,2L,pbuf);      /* mark the resolution   */
  158.         for(i=0;i<16;i++){              /* and the color palette */
  159.             n = Fread(p_chan,2L,pbuf);
  160.             }
  161.         pbuf = (BYTE *)dMFDB.address;
  162.         n = Fread(p_chan,32000L,pbuf);
  163.         if(n != 32000)printf("error - sav_pic failed!\n");
  164.         Fclose(p_chan);                  /* and close the file    */
  165.         rst_scrn();
  166.         Cconout(BELL);                    /*  *** DING ***         */
  167.         }
  168.     else{
  169.         button = form_alert(1,"[1][That file cannot be opened.][O.K.]");
  170.         }
  171.     }
  172. }
  173.  
  174.  
  175. /* -------------- DEGAS screen save (needs work) -------------- */
  176.  
  177. sav_pic()                       /* starts like send_file() */
  178. {
  179. BYTE d_path[256],f_spec[256],f_name[40];
  180. WORD j, r, ret, button, p_chan;
  181. BYTE c,*pbuf;
  182. unsigned WORD i,n;
  183.  
  184. strcpy(d_path,"\\*.*");
  185. strcpy(f_spec,"________.___");
  186. sav_scrn();
  187. graf_mouse(0,0L);
  188. graf_mouse(257,0L);
  189. ret = fsel_input(d_path,f_spec,&button);
  190. graf_mouse(256,0L);
  191. rst_scrn();
  192. if(button == 1){
  193.     r = Getrez();
  194.     combine(d_path,f_spec,f_name);
  195.     for(i=0;i<40;i++){
  196.         if((f_name[i] == '.')||(f_name[i] == 0))break;
  197.         }
  198.     f_name[i++] = '.';
  199.     f_name[i++] = 'p';          /* here the file .ext is forced */
  200.     f_name[i++] = 'i';
  201.     c =  r + 49;
  202.     f_name[i++] = c;
  203.     f_name[i] = 0;
  204.     p_chan = Fcreate(f_name,0);
  205.     if(p_chan > 0){
  206.         pbuf = (BYTE *)&r;
  207.         n = Fwrite(p_chan,2L,pbuf);      /* mark the resolution   */
  208.         for(i=0;i<16;i++){              /* and the color palette */
  209.             j = Setcolor(i,-1);
  210.             pbuf = (BYTE *)&j;
  211.             n = Fwrite(p_chan,2L,pbuf);
  212.             }
  213.         pbuf = (BYTE *)dMFDB.address;
  214.         n = Fwrite(p_chan,32000L,pbuf);
  215.         if(n != 32000)printf("error - sav_pic failed!\n");
  216.         Fclose(p_chan);                  /* and close the file    */
  217.         Cconout(BELL);                    /*  *** DING ***         */
  218.         }
  219.     else{
  220.         button = form_alert(1,"[1][That file cannot be opened.][O.K.]");
  221.         }
  222.     }
  223. }
  224.  
  225. /* ------ utility to generate file spec. from fsel_input() data ------ */
  226.  
  227. combine(d_s,f_s,f_n)
  228. BYTE *d_s,*f_s,*f_n;
  229.  
  230.                /*  Local Vars: */
  231.  
  232.                /*  d_s : disk specification (A:\\)
  233.                    f_s : file specification (test.dat)
  234.                    f_n : file name (A:\\test.dat)    */
  235.  
  236. {
  237. BYTE q;
  238. while((q = *d_s++) != '*')*f_n++ = q;   /* copy from d_s    */
  239. while((q = *f_s++) != 0)*f_n++ = q;     /* then copy f_s    */
  240. *f_n = 0;                   /* and terminate the string */
  241. }
  242.  
  243. /* ------------------- utility to save screen in char. array ------------ */
  244.  
  245. sav_scrn()
  246. {
  247. vro_cpyfm(handle,3,pxy,&sMFDB,&dMFDB);
  248. }
  249.  
  250. /* ------------ restore a previously saved screen ------------------ */
  251.  
  252. rst_scrn()
  253. {
  254. vro_cpyfm(handle,3,pxy,&dMFDB,&sMFDB);
  255. }
  256.  
  257. /*---------------- message() - string printing -------------- */
  258.  
  259.  
  260. message(s)
  261. char *s;
  262. {
  263. char q;
  264. while ((q = *s++) != 0)Cconout(q);
  265. }
  266.  
  267. gcharc()
  268. {
  269. LONG q;
  270. WORD i,j;
  271. q = Crawcin();               /* get scan code                  */
  272. i = q & 65535;              /* we only want low 16 bits       */
  273. if(i != 0)return(i);        /* bank 1 - return it             */
  274. q = q - i;                  /* it's bank 2: convert           */
  275. j = q / 65536;
  276. j = j + 128;                /* bump it up to 128 - 255        */
  277. return(j);                  /* and return it                  */
  278. }
  279.  
  280.  
  281. control()
  282. {
  283. int i;
  284. i = gcharc();
  285. if(i == HELP){                 /* user wants the help menu         */
  286.     sav_scrn();                     /* save screen                      */
  287.     Cconout(ESC);                    /* clear screen & home cursor       */
  288.     Cconout('E');
  289.     printf("The following Functions are Implemented:\n\n");/* display menu */
  290.     printf("F1   -   load picture\n");
  291.     printf("F2   -   save picture\n");
  292.     printf("F3   -   enhance (SLOW)\n");
  293.     printf("F4   -   eliminate grey\n");
  294.     printf("F5   -   invert\n");
  295.     printf("F6   -   edge (SLOW - run F3 first)\n");
  296.     printf("F7   -   dither\n");
  297.     printf("F8   -   scramble\n");
  298.     printf("F9   -   save to TEK file (SLOW! MEMORY HOG!\n");
  299.     printf("F10  -   print screen\n");
  300.     printf("CLR  -   clear screen\n");
  301.     printf("UNDO -   quit\n");
  302.     printf("\nhit any key:");
  303.     Cconin();
  304.     rst_scrn();                              /* restore screen        */
  305.     }
  306.  
  307. else if(i == F2){                 /* user wants to save screen (DEGAS)   */
  308.     sav_pic();                    /* execute */
  309.     }
  310.  
  311. else if(i == F1){
  312.     load_pic();
  313.     }
  314.  
  315. else if(i == F3)enhance();
  316.  
  317. else if(i == F4)grid();
  318.  
  319. else if(i == F5)invert();
  320.  
  321. else if(i == F6)edge();
  322.  
  323. else if(i == F7)dither();
  324.  
  325. else if(i == F8)scramble();
  326.  
  327. else if(i == F9)tek();
  328.  
  329. else if(i == F10)print_screen(sMFDB.address);
  330.  
  331. else if(i == CLR){
  332.     v_clrwk(handle);
  333.     sav_scrn();
  334.     }
  335.  
  336. else if(i == UNDO){
  337.     end_prg();
  338.     }
  339.  
  340. }
  341.  
  342. scramble()
  343. {
  344. WORD x0,y0,i,x1,y1;
  345. LONG j;
  346. register WORD x,y,xx,yy;
  347. sav_scrn();
  348. v_clrwk(handle);
  349. for(x = 1;x < 640;x = x + 2){
  350.     for(y = 1;y < 400;y = y + 2){
  351.  
  352.         x0 = x - 1;
  353.         y0 = y - 1;
  354.         x1 = x + 1;
  355.         y1 = y + 1;
  356.         i = 0;
  357.  
  358.         for(xx = x0;xx < x1;xx++){
  359.             for(yy = y0;yy < y1;yy++){
  360.                 i = i + point(dMFDB.address,xx,yy);
  361.                 }
  362.             }
  363.         if(i == 1){
  364.             if((j = Random()) < 9500000L)set(sMFDB.address,x0,y0,1);
  365.             if((j = Random()) < 9500000L)set(sMFDB.address,x0,y,1);
  366.             if((j = Random()) < 9500000L)set(sMFDB.address,x,y,1);
  367.             if((j = Random()) < 9500000L)set(sMFDB.address,x,y0,1);
  368.             }
  369.         else if(i == 2){
  370.             if((j = Random()) < 11500000L)set(sMFDB.address,x0,y0,1);
  371.             if((j = Random()) < 11500000L)set(sMFDB.address,x0,y,1);
  372.             if((j = Random()) < 11500000L)set(sMFDB.address,x,y,1);
  373.             if((j = Random()) < 11500000L)set(sMFDB.address,x,y0,1);
  374.             }
  375.         else if(i == 3){
  376.             if((j = Random()) < 15000000L)set(sMFDB.address,x0,y0,1);
  377.             if((j = Random()) < 15000000L)set(sMFDB.address,x0,y,1);
  378.             if((j = Random()) < 15000000L)set(sMFDB.address,x,y,1);
  379.             if((j = Random()) < 15000000L)set(sMFDB.address,x,y0,1);
  380.             }
  381.         else if(i == 4){
  382.             set(sMFDB.address,x0,y0,1);
  383.             set(sMFDB.address,x0,y,1);
  384.             set(sMFDB.address,x,y,1);
  385.             set(sMFDB.address,x,y0,1);
  386.             }
  387.         }
  388.     }
  389. sav_scrn();
  390. }
  391.  
  392.  
  393. dither()
  394. {
  395. WORD x0,y0,i,x1,y1;
  396. register WORD x,y,xx,yy;
  397. sav_scrn();
  398. v_clrwk(handle);
  399. for(x = 1;x < 640;x = x + 2){
  400.     for(y = 1;y < 400;y = y + 2){
  401.  
  402.         x0 = x - 1;
  403.         y0 = y - 1;
  404.         x1 = x + 1;
  405.         y1 = y + 1;
  406.         i = 0;
  407.  
  408.         for(xx = x0;xx < x1;xx++){
  409.             for(yy = y0;yy < y1;yy++){
  410.                 i = i + point(dMFDB.address,xx,yy);
  411.                 }
  412.             }
  413.         if(i == 1){
  414.             set(sMFDB.address,x0,y0,1);
  415.             set(sMFDB.address,x0,y,0);
  416.             set(sMFDB.address,x,y,0);
  417.             set(sMFDB.address,x,y0,0);
  418.             }
  419.         else if(i == 2){
  420.             set(sMFDB.address,x0,y0,0);
  421.             set(sMFDB.address,x0,y,1);
  422.             set(sMFDB.address,x,y,0);
  423.             set(sMFDB.address,x,y0,1);
  424.             }
  425.         else if(i == 3){
  426.             set(sMFDB.address,x0,y0,0);
  427.             set(sMFDB.address,x0,y,1);
  428.             set(sMFDB.address,x,y,1);
  429.             set(sMFDB.address,x,y0,1);
  430.             }
  431.         else if(i == 4){
  432.             set(sMFDB.address,x0,y0,1);
  433.             set(sMFDB.address,x0,y,1);
  434.             set(sMFDB.address,x,y,1);
  435.             set(sMFDB.address,x,y0,1);
  436.             }
  437.         }
  438.     }
  439. sav_scrn();
  440. }
  441.  
  442. invert()
  443. {
  444.  
  445. register WORD i,x,y;
  446. sav_scrn();
  447.  
  448. for(x = 1;x < 639; x++){
  449.     for(y = 1;y < 399; y++){
  450.  
  451.         i = point(sMFDB.address,x,y);
  452.         if(i != 0)set(sMFDB.address,x,y,0);
  453.         else set(sMFDB.address,x,y,1);
  454.         }
  455.     }
  456. }
  457.  
  458. edge()
  459. {
  460.  
  461. register WORD x,y,i;
  462. WORD x0,x1,y0,y1;
  463. sav_scrn();
  464.  
  465. /*    clear edge    */
  466.  
  467. for(x = 0;x < 640;x++){
  468.     set(sMFDB.address,x,0,0);
  469.     set(sMFDB.address,x,399,0);
  470.     }
  471. for(y = 0;y < 400;y++){
  472.     set(sMFDB.address,0,y,0);
  473.     set(sMFDB.address,639,y,0);
  474.     }
  475.  
  476. /*    now do it */
  477.  
  478. for(x = 1;x < 639; x++){
  479.     for(y = 1;y < 399; y++){
  480.  
  481.         i = 0;
  482.         x0 = x - 1;
  483.         x1 = x + 1;
  484.         y0 = y - 1;
  485.         y1 = y + 1;
  486.  
  487.         i = i + point(dMFDB.address,x0,y0);
  488.         i = i + point(dMFDB.address,x0,y);
  489.         i = i + point(dMFDB.address,x0,y1);
  490.         i = i + point(dMFDB.address,x,y0);
  491.         i = i + point(dMFDB.address,x,y);
  492.         i = i + point(dMFDB.address,x,y1);
  493.         i = i + point(dMFDB.address,x1,y0);
  494.         i = i + point(dMFDB.address,x1,y);
  495.         i = i + point(dMFDB.address,x1,y1);
  496.  
  497.         if((i == 0)||(i == 9))set(sMFDB.address,x,y,0);
  498.         else set(sMFDB.address,x,y,1);
  499.  
  500.  
  501.         }
  502.     }
  503. }
  504.  
  505.  
  506.  
  507. enhance()
  508. {
  509.  
  510. register WORD x,y,i;
  511. WORD x0,x1,y0,y1;
  512. sav_scrn();
  513.  
  514. /*    clear edge    */
  515.  
  516. for(x = 0;x < 640;x++){
  517.     set(sMFDB.address,x,0,0);
  518.     set(sMFDB.address,x,399,0);
  519.     }
  520. for(y = 0;y < 400;y++){
  521.     set(sMFDB.address,0,y,0);
  522.     set(sMFDB.address,639,y,0);
  523.     }
  524.  
  525. /*    now do it */
  526.  
  527. for(x = 1;x < 639; x++){
  528.     for(y = 1;y < 399; y++){
  529.  
  530.         i = 0;
  531.         x0 = x - 1;
  532.         x1 = x + 1;
  533.         y0 = y - 1;
  534.         y1 = y + 1;
  535.  
  536.         i = i + point(dMFDB.address,x0,y0);
  537.         i = i + point(dMFDB.address,x0,y);
  538.         i = i + point(dMFDB.address,x0,y1);
  539.         i = i + point(dMFDB.address,x,y0);
  540.         i = i + point(dMFDB.address,x,y);
  541.         i = i + point(dMFDB.address,x,y1);
  542.         i = i + point(dMFDB.address,x1,y0);
  543.         i = i + point(dMFDB.address,x1,y);
  544.         i = i + point(dMFDB.address,x1,y1);
  545.  
  546.  
  547.         if(i > 4)set(sMFDB.address,x,y,1);
  548.         else set(sMFDB.address,x,y,0);
  549.  
  550.  
  551.         }
  552.     }
  553. }
  554. grid()
  555. {
  556.  
  557. register WORD x,y,i,j;
  558. WORD x0,x1,y0,y1;
  559. sav_scrn();
  560.  
  561. /*    clear edge    */
  562.  
  563. for(x = 0;x < 640;x++){
  564.     set(sMFDB.address,x,0,0);
  565.     set(sMFDB.address,x,399,0);
  566.     }
  567. for(y = 0;y < 400;y++){
  568.     set(sMFDB.address,0,y,0);
  569.     set(sMFDB.address,639,y,0);
  570.     }
  571.  
  572. /*    now do it */
  573.  
  574. for(x = 1;x < 639; x++){
  575.     for(y = 1;y < 399; y++){
  576.  
  577.         i = 0;
  578.         x0 = x - 1;
  579.         x1 = x + 1;
  580.         y0 = y - 1;
  581.         y1 = y + 1;
  582.  
  583.         i = i + point(dMFDB.address,x0,y0);
  584.         i = i + point(dMFDB.address,x0,y);
  585.         i = i + point(dMFDB.address,x0,y1);
  586.         i = i + point(dMFDB.address,x,y0);
  587.         i = i + point(dMFDB.address,x,y1);
  588.         i = i + point(dMFDB.address,x1,y0);
  589.         i = i + point(dMFDB.address,x1,y);
  590.         i = i + point(dMFDB.address,x1,y1);
  591.  
  592.         if(i == 4)set(sMFDB.address,x,y,0);
  593.         }
  594.     }
  595. }
  596.  
  597. WORD point(Address,x,y)
  598. BYTE *Address;
  599. WORD x,y;
  600. {
  601. register LONG a;
  602. register WORD b,xx;
  603. BYTE c,d,e,power_two();
  604. BYTE *data;
  605.  
  606. a = (LONG)y * 80L;
  607. b = x / 8;
  608. a = a + (LONG)b + (LONG)Address;
  609. data = (BYTE *)a;
  610. d = *data;
  611. xx = b * 8;
  612. xx =  x - xx;
  613. xx = 7 - xx;
  614. c = power_two(xx);
  615. d = c & d;
  616. if(d == 0)return(0);
  617. else return(1);
  618. }
  619.  
  620. set(Address,x,y,val)
  621. BYTE *Address;
  622. WORD x,y,val;
  623. {
  624. register LONG a;
  625. register WORD b,xx;
  626. BYTE c,d,e,power_two();
  627. BYTE *data;
  628.  
  629. a = (LONG)y * 80L;
  630. b = x / 8;
  631. a = a + (LONG)b + (LONG)Address;
  632. data = (BYTE *)a;
  633. d = *data;
  634. xx = b * 8;
  635. xx =  x - xx;
  636. xx = 7 - xx;
  637. c = power_two(xx);
  638. d = c & d;
  639. d = 255 - d;
  640. *data = *data & d;
  641. if(val != 0)*data = *data | c;
  642. }
  643.  
  644. BYTE power_two(x)
  645. register WORD x;
  646. {
  647. if(x == 0)return(1);
  648. else if(x == 1)return(2);
  649. else if(x == 2)return(4);
  650. else if(x == 3)return(8);
  651. else if(x == 4)return(16);
  652. else if(x == 5)return(32);
  653. else if(x == 6)return(64);
  654. else if(x == 7)return(128);
  655. else return(0);
  656. }
  657.  
  658. send_file()
  659. {
  660. BYTE d_path[256],f_spec[256],f_name[40];
  661. WORD ret, button;
  662.  
  663.         /* local vars:  */
  664.  
  665.         /*  d_path  -   pathname (i.e. - disk & directory)
  666.             f_spec  -   file specification
  667.             f_name  -   file name
  668.  
  669.             ret     - return value
  670.             button  - button value  */
  671. sav_scrn();
  672.  
  673. strcpy(d_path,"\\*.*");             /* set up arrays */
  674. strcpy(f_spec,"________.___");
  675. graf_mouse(0,0L);
  676. graf_mouse(257,0L);
  677. ret = fsel_input(d_path,f_spec,&button);     /* get user's selection */
  678. graf_mouse(256,0L);
  679. if(button == 1){                /* user selected a file: */
  680.     combine(d_path,f_spec,f_name);      /*   get the filename */
  681.     s_chan = fopen(f_name,"bw");         /*   open it */
  682.     }
  683. rst_scrn();
  684. }
  685.  
  686. tek()                   /* sends screen to file */
  687. {
  688. WORD xl,yl,xh,yh,xm,ym,oyh,oyl,oxh,yflag,a,b,width,height;
  689. register LONG xx,yy;
  690. register WORD i,j;
  691. LONG x00,y00,x11,y11;
  692.  
  693. send_file();
  694.  
  695. graf_mouse(0,0L);
  696. graf_mouse(257,0L);
  697. i = form_alert(1,"[0][Position mouse at upper left|corner of digitizing region|then hold down button|and drag to lower right corner][okay...]");
  698. graf_mouse(5,0L);
  699.  
  700. i = evnt_button(1,1,1,&xm,&ym,&a,&b);
  701.  
  702. graf_mouse(0,0L);
  703. i = graf_rubberbox(xm,ym,1,1,&width,&height);
  704. graf_mouse(256,0L);
  705. rst_scrn();
  706. x00 = (LONG)xm * 1023L / 639L;
  707. y00 = 399L - (LONG)ym;
  708. y00 = y00 * 779L / 399L;
  709. x11 = (LONG)(xm + width);
  710. x11 = x11 * 1023L / 639L;
  711. y11 = (LONG)(ym + height);
  712. y11 = 399L - y11;
  713. y11 = y11 * 779L / 399L;
  714.  
  715. i = putc(ESC,s_chan);
  716. i = putc(FF,s_chan);
  717. i = putc(FS,s_chan);
  718. for(yy = y11;yy < y00; yy = yy + 1L){
  719.  
  720.     ym = (WORD)(yy * 399L / 779L);
  721.     ym = 399 - ym;
  722.     yl = yy & 31;
  723.     yh = (yy - yl) / 32;
  724.     yl = yl | 96;
  725.     yh = yh | 32;
  726.     yflag = 1;
  727.  
  728.     for(xx = x00;xx < x11;xx = xx + 1L){
  729.         xm = (WORD)(xx * 639L / 1023L);
  730.         j = point(dMFDB.address,xm,ym);
  731.         if(j > 0){
  732.             xl = xx & 31;
  733.             xh = (xx - xl) / 32;
  734.             xl = xl | 64;
  735.             xh = xh | 32;
  736.             if(yflag == 1){
  737.                 i = putc(yh,s_chan);
  738.                 i = putc(yl,s_chan);
  739.                 i = putc(xh,s_chan);
  740.                 i = putc(xl,s_chan);
  741.                 yflag = 0;
  742.                 }
  743.             else if(oxh != xh){
  744.                 i = putc(yl,s_chan);
  745.                 i = putc(xh,s_chan);
  746.                 i = putc(xl,s_chan);
  747.                 }
  748.             else i = putc(xl,s_chan);
  749.             oxh = xh;
  750.             }
  751.         }
  752.     }
  753. i = putc(CR,s_chan);
  754. i = putc(BELL,s_chan);
  755. fclose(s_chan);
  756. Cconout(BELL);
  757. }
  758.  
  759. print_screen(gbuf)
  760. BYTE *gbuf;
  761. {
  762. WORD i,r,c;
  763. for(i=0;i<5;i++)Cprnout(10);
  764. Cprnout(27);
  765. Cprnout(65);
  766. Cprnout(8);
  767. for(r=0;r<80;r++){
  768.     for(i=0;i<11;i++)Cprnout(32);
  769.     Cprnout(27);
  770.     Cprnout(42);
  771.     Cprnout(5);
  772.     Cprnout(144);
  773.     Cprnout(1);
  774.     for(c=399;c>-1;c--){
  775.         i = (c * 80) + r;
  776.         Cprnout(gbuf[i]);
  777.         }
  778.     Cprnout(13);
  779.     Cprnout(10);
  780.     }
  781. Cprnout(12);
  782. Cprnout(27);
  783. Cprnout(64);
  784. }
  785.